package com.tianji.learning.mq;

import com.tianji.common.constants.MqConstants;
import com.tianji.learning.enums.PointsRecordType;
import com.tianji.learning.mq.message.SignInMessage;
import com.tianji.learning.controller.service.IPointsRecordService;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.amqp.core.ExchangeTypes;
import org.springframework.amqp.rabbit.annotation.Exchange;
import org.springframework.amqp.rabbit.annotation.Queue;
import org.springframework.amqp.rabbit.annotation.QueueBinding;
import org.springframework.amqp.rabbit.annotation.RabbitListener;
import org.springframework.stereotype.Component;

/***
 * 消费消息 用于保存积分
 */
@Slf4j
@Component
@RequiredArgsConstructor
public class LearningPointsListener {
    //调用service层的方法实现新建积分表的功能
    private final IPointsRecordService pointsRecordService;
    /***
     * 签到增加积分
     * @param msg
     */
    //@RabbitListener注解表示这个方法作为RabbitMQ的消息的监听类，该方法会用于处理MQ的消息
    //bindings是@RabbitListener注解里面的参数，用于说明交换机、路由键和队列的绑定关系
    //绑定关系确定后就可以明确该方法监听的队列是存储的那个交换机路由键发来的消息
    //@QueueBinding注解里面有三个参数。分别是value：队列，exchange：交换机，key：路由键
    //队列可以理解为邮箱，交换机可以理解为快递公司，路由键可以理解为收货地址
    @RabbitListener(bindings = @QueueBinding(
            //指定该方法监听的是哪个队列，这个名字无所谓，只要不重复就行，因为消费者知道队列，生产者是不知道的
            value = @Queue(value = "sign.points.queue",durable = "true"),
            //指定是队列是收到哪个交换机发来的消息，value是一个常量，生产者和消费者保持一致
            exchange = @Exchange(value = MqConstants.Exchange.LEARNING_EXCHANGE,type = ExchangeTypes.TOPIC),
            //指定路由键，确保交换机的消息正确到哪个队列里面
            key = MqConstants.Key.SIGN_IN))
    public void listenSignInListener(SignInMessage msg){//SignInMessage是生产者通过队列发送的消息对象
        //PointsRecordType.SIGN表示积分类型是签到，因为这个接口监听到的是签到相关的队列
        pointsRecordService.addPointRecord(msg, PointsRecordType.SIGN);//调用service层新增积分
    }

    /***
     * 问答增加积分
     * @param msg
     */
    @RabbitListener(bindings = @QueueBinding(
            value = @Queue(value = "qa.points.queue",durable = "true"),
            exchange = @Exchange(value = MqConstants.Exchange.LEARNING_EXCHANGE,type = ExchangeTypes.TOPIC),
            key = MqConstants.Key.WRITE_REPLY))
    public void listenReplyListener(SignInMessage msg){
        pointsRecordService.addPointRecord(msg, PointsRecordType.QA);
    }
}
